package main

import (
	"fmt"
	"math"
	"strings"
)

func BinaryFormat(n int32) string {
	a := uint32(n)               //有符号转为无符号
	sb := strings.Builder{}      //把多个短字符串拼接成一个长字符串
	c := uint32(math.Pow(2, 31)) //最高位是1，其他位全是0 (//求2的31次方的幂值 二进制为：10000000000000000000000000000000)
	for i := 0; i < 32; i++ {
		if c&a != 0 { //
			sb.WriteString("1") //往sb后面拼接“1”
		} else {
			sb.WriteString("0") //往sb后面拼接“0”
		}
		c >>= 1 //等同于 c=c>>1
	}
	return sb.String() //返回长度为32的字符串
}

func main() {
	fmt.Printf("a=%s\n", BinaryFormat(100))
	fmt.Printf("a=%s\n", BinaryFormat(-100))
	fmt.Printf("a=%s\n", BinaryFormat(-58964))
	fmt.Printf("a=%s\n", BinaryFormat(8320))
	fmt.Printf("a=%s", BinaryFormat(1024))
}

/*
此题需要的知识点铺垫，与运算机制如下

总结：两位同时为1，结果才为1，否则结果为0。
例如：3&5 即 0000 0011& 0000 0101 = 0000 0001，因此 3&5 的值得1。
0000 0011
0000 0101
0000 0001

正数
0 0 0 0 0 1 0 0 = 4
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 1 0 0 = 4 & 5 = 4

正数负数
1 1 1 1 1 1 0 0 = -4补
0 0 0 0 0 1 0 1 = 5
————————
0 0 0 0 0 1 0 0 = -4 & 5 = 4

负数
1 1 1 1 1 1 0 0 = -4补
1 1 1 1 1 0 1 1 = -5补
————————
1 1 1 1 1 0 0 0 = [-4 & -5]补； -4 & -5=[[-4 & -5]补]补 =1 0001000 = -8
1 1 1 1 1 0 0 0的反码是 1 0 0 0 0 1 1 1补码是1 0 0 0 1 0 0 0
————————————————

源码，反码，补码相关知识
原码 （一个字节）8位为例
	最高位为符号位，0代表正数，1代表负数，非符号位为该数字的绝对值的二进制。
反码
	正数的反码与原码一致 负数的反码是对原码按位取反，只是最高位（符号位）不变
补码
	正数的补码与原码一致，负数的补码是该数的反码加1

          5          -5
原码：0000 0101   1000 0101
反码：0000 0101   1111 1010
补码：0000 0101   1111 1011
*/

